package com.gok.util;

import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: Administrator
 * @create time: 2020/12/23 20:33
 * @description:
 */
@Component
public class MapAndObjectUtil<T> {
    /**
     * Class对象解析为Map集合
     * @param t  泛型--表示任意对象
     * @return
     */
    public Map<String,Object> toMap(T t) {
        Class c = t.getClass();

        //缓存中存放数据的hashMap
        Map<String,Object> map = new HashMap<>();

        try {
            //获取对象的所有字段
            Field[] fields = c.getDeclaredFields();

            for(Field f : fields){
                //获取访问权限
                f.setAccessible(true);
                //将这个对象(t)的属性解析到一个map中
                if(f.get(t) != null){
                    map.put(f.getName(),f.get(t));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }


    /**
     * map集合解析为对象
     * @param map  存有数据的map集合
     * @param c    要转为的对象
     * @return
     */
    public T toObject(Map map,Class<T> c) throws Exception {
        Object obj = null;

        //获取这个对象中所有的字段
        Field[] fields = c.getDeclaredFields();

        obj = c.getConstructor().newInstance();
        //遍历每一个字段
        for(Field f : fields){
            //获取访问权限
            f.setAccessible(true);

            //把map中相同名称的字段赋值到当前的对象之中
            f.set(obj,map.get(f.getName()));
        }
        return  (T)obj;
    }
}
